<!DOCTYPE html>
<html lang='en'>

<head>
  <meta charset='UTF-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1.0'>
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    li {
      list-style: none
    }

    .upload-c {
      width: 80%;
      margin: auto;
      border: 1px solid #e64f4f;
      height: 100px;
      text-align: center;
      line-height: 100px;
      margin-top: 20px;
    }

    .upload-btn {
      width: 100px;
      text-align: center;
      height: 30px;
      line-height: 30px;
      margin: auto;
      margin-top: 20px;
      border: 1px solid red;
    }
  </style>
</head>

<body>
  <div class='contain' id="app">
    <div class="upload-c">
      上传
    </div>
    <div id="viewContainer">

    </div>
  </div>
  <div id="uploadBtn" class="upload-btn">
    提交
  </div>
  <script type="module">
    // import { MAX_FILE_SIZE, CHUNK_SIZE } from './constants.js';
    // import request from './request.js';
    // const app =  document.querySelector('#app');
    // const uploadBtn = document.querySelector('#uploadBtn');
    // let nowShowFile = null;


    // /**
    //  * 1. 队列, 控制上传同时上传最大5个
    //  * 切片数量动态调整,自适应
    //  * 
    //  * 文件流type 和formdata的区别
    //  * 文件流的话只能上传二进制文件
    //  * formdata可以上传文件和普通字段
    // */

    // function handleDrag(e) {
    //   e.preventDefault()
    //   e.stopPropagation()
    //   const files = e.dataTransfer.files;
    //   if(checkFile(files)) {
    //     showFiles(files)
    //     nowShowFile = files[0];
    //   }
    // }

    // function showFiles(files) {
    //   const file = files[0];
    //   const url = URL.createObjectURL(file)
    //   if(file.type.startsWith('image/')) {
    //     const img = document.createElement('img')
    //     img.src = url;
    //     document.querySelector('#viewContainer').appendChild(img)
    //   } else if(file.type.startsWith('video/')) {
    //     const video = document.createElement('video')
    //     video.src = url;
    //     document.querySelector('#viewContainer').appendChild(video)
    //   }
    // }

    // function checkFile(files) {
    //   const file = files[0];
    //   if(!file) {
    //     return
    //   }
    //   if(file.size > MAX_FILE_SIZE) {
    //     return alert('文件大小不能超过2g')
    //   }

    //   if(!(file.type.startsWith('image/') || file.type.startsWith('video/') )) {
    //     return alert('文件类型只能是图片或视频')
    //   }
    //   return true
    // }

    // app.addEventListener('dragenter', handleDrag)
    // app.addEventListener('dragover', handleDrag)
    // app.addEventListener('drop', handleDrag)
    // app.addEventListener('dragleave', handleDrag)

    // /**
    //  * 1. 计算hash值
    // */

    // uploadBtn.addEventListener('click', async () => {
    //   if(!nowShowFile) return alert('请上传文件');
    //   const fileName = await getFileName(nowShowFile)

    //   /**
    //    * 上传文件
    //    * 1. 大文件切片.
    //   */
    //   uploadFile(nowShowFile, fileName)
    //  return 
    // })
    
    // async function uploadFile(file, fileName) {
    //   // 切片
    //   const chunks = createFileChunks(file, fileName)
    //   console.log(chunks)
    //   // 上传
    //   const requests = chunks.map(item => {
    //     return createRequest(item, fileName)
    //   })

    //   // try {
    //   //   const resArr = await Promise.all(requests)
    //   //   const res = await request.get(`/merge/${fileName}`)
    //   //   console.log(res)
    //   //   alert('上传成功')
    //   // } catch (error) {
    //   //   console.log(error)
    //   // }

    // }

    // function createRequest(fileItem, fileName) {
    //   const {chunkFileName, chunk: file} = fileItem;
    //   debugger
    //   return request.post(`/upload/${fileName}`, file, {
    //     headers: {
    //       'Content-Type': 'application/octet-stream'
    //     },
    //     params: {
    //       chunkFileName
    //     }
    //   })
    // }

    // // createFileChunks

    // function createFileChunks(file, fileName) {
    //   const chunks = [];
    //   // 切片数
    //   const count = Math.ceil(file.size / CHUNK_SIZE);
    //   console.log(count, 'countcountcountcount')
    //   for (let i = 0; i < count; i++) {
    //     const chunk = file.slice(i*CHUNK_SIZE, (i+1)*CHUNK_SIZE);
    //     chunks.push({
    //       chunk,
    //       chunkFileName: `${fileName}-${i}`
    //     })
    //   }
    //   return chunks
    // }

    // async function getFileName(file) {
    //   const fileHash = await calculateFileHash(file);
    //   // 文件名
    //   const fileExtension = file.name.split('.').pop();
    //   return `${fileHash}.${fileExtension}`
    // }

    // async function calculateFileHash(file) {
    //   const arrayBuffer = await file.arrayBuffer()
    //   // crypto.subtle.digest加密
    //   const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
    //   // hashBuffer 是二进制,需要转十进制
    //   return bufferToHex(hashBuffer)
    // }

    // // 将一个arrayBuffer 转成16进制的字符串
    // function bufferToHex(hashBuffer) {
    //   // buffer转字符串
    //    return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('')
    // }



    let a = [1,2,3,4,54,6,7, 10,1,1,12,3,3,4,5]

    let nowUploadArr = []
    let maxNum = 5;
    bcd()
    function bcd() {
      let vv = a.length > maxNum ? maxNum : a.length;
      for (let i = 0; i < vv; i++) {
        upload()
      }
    }

    function upload() {
      if(a.length == 0) return
      const cc = a.shift();
      nowUploadArr.push(cc)
      uploadFile(cc)
    }

    function uploadFile(file) {
      return new Promise((resolve) => {
        setTimeout(() => {
          upload()
          nowUploadArr.splice(nowUploadArr.indexOf(file), 1)
          console.log('file', JSON.stringify(nowUploadArr))
          resolve(file)
        }, 1000 * Math.random());
      })
    }

  </script>
</body>

</html>